package cn.tedu.csmall.product.service.impl;

import cn.tedu.csmall.product.ex.ServiceException;
import cn.tedu.csmall.product.mapper.AlbumMapper;
import cn.tedu.csmall.product.pojo.dto.AlbumAddNewDTO;
import cn.tedu.csmall.product.pojo.entity.Album;
import cn.tedu.csmall.product.pojo.vo.AlbumListItemVO;
import cn.tedu.csmall.product.pojo.vo.AlbumStandardVO;
import cn.tedu.csmall.product.service.IAlbumService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Slf4j
@Service
public class AlbumServiceImpl implements IAlbumService {

    //自动装配mapper
    @Autowired
    private AlbumMapper albumMapper;

    public AlbumServiceImpl() {
        log.info("创建业务对象：AlbumServiceImpl ");
    }


    /**
     * 添加相册数据
     * @param albumAddNewDTO 添加相册数据封装到了AlbumAddNewDTO对象里面
     */
    @Override
    public void addNew(AlbumAddNewDTO albumAddNewDTO) {
        log.debug("开始处理【添加相册】的业务，参数：{}", albumAddNewDTO);
        // 调用AlbumMapper对象的int countByName(String name)方法统计此名称的相册的数量
        String name = albumAddNewDTO.getName();
        int countByName = albumMapper.countByName(name);
        log.debug("尝试添加的相册名称是：{}，在数据库中此名称的相册数量为：{}", name, countByName);
        // 判断统计结果是否大于0
        if (countByName > 0) {
            // 是：相册名称已经存在，抛出RuntimeException异常
            String message = "添加相册失败！相册名称【" + name + "】已存在！";
            log.warn(message);
            throw new ServiceException(ERR_CONFLICT,message);
        }

        // 获取当前时间：LocalDateTime now = LocalDateTime.now()
        LocalDateTime now = LocalDateTime.now();
        // 创建Album对象
        Album album = new Album();
        // 补全Album对象中各属性的值：name：来自参数
        // 补全Album对象中各属性的值：description：来自参数
        // 补全Album对象中各属性的值：sort：来自参数
        BeanUtils.copyProperties(albumAddNewDTO, album);
        // 补全Album对象中各属性的值：gmtCreate：now
        album.setGmtCreate(now);
        // 补全Album对象中各属性的值：gmtModified：now
        album.setGmtModified(now);
        // 调用AlbumMapper对象的int insert(Album album)方法插入相册数据
        log.debug("即将向数据库中插入数据：{}", album);
        int rows = albumMapper.insert(album);
        // 判断插入数据时受影响的行数是否有误
        if (rows != 1) {
            String message = "添加相册失败！服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ERR_INSERT,message);
        }
    }

    /**
     * 根据id删除删除相册数据
     * @param id 相册id
     */
    @Override
    public void deleteById(Long id) {
        log.debug("开始处理【删除相册】的业务，参数相册id={}", id);
        //调用AlbumMapper接口中的AlbumStandardVO getStandardById(Long id)检查相册是否存在
        AlbumStandardVO standardById = albumMapper.getStandardById(id);
        if(standardById == null){
            String message = "删除失败，相册不存在";
            log.warn(message);
            throw new ServiceException(ERR_NOT_FOUND,message);

        }
        //自动装配AlbumMapper接口
        //调用AlbumMapper接口中的int deleteById(Long id)删除相册数据
        int rows = albumMapper.deleteById(id);
        if(rows !=1){
            throw new ServiceException(ERR_DELETE,"删除相册失败，服务器忙，请稍后再次尝试！");
        }
        log.debug("删除完成");
    }

    /**
     * 查询全部相册数据
     * @return
     */
    @Override
    public List<AlbumListItemVO> listData() {
        return albumMapper.getAlbumDataList();
    }
}
